package model;

/**
 * Classe qui représente le type d'une carte et qui détérmine le temps d'action
 * de son effet
 *
 * @author Antoine Thorr, Joana Santos, Samy Rida, Vicky Ngo Pagbe
 */
public final class Type {
//  Attribut : elle a une description, un descriptif de son effet et un nom
//!\ Classe pas encore utilisée et donc pas au point /!\

    private String nomType;
    private String effet;
    private String description;
    private String anecdotes;

    /**
     * Constructeur qui prend en paramètre le nom du type de la carte.
     *
     * @param type
     */
    public Type(String type) {
        this.nomType = type;
        this.setCaract(type);
    }

    /**
     * Permet selon le type passé en paramètre de définir l'effet, la
     * description et une anecdote sur la carte.
     *
     * @param type
     */
    public void setCaract(String type) {
        switch (type) {
            case "DDoS":
                this.effet = "Empêche l'adversaire de poser des cartes au prochain tour (jetable)";
                this.description = "Le 'Distributed denial-of-service' ou déni de service distribué "
                        + "est un type d'attaque très évolué visant à faire planter ou à rendre muette "
                        + "une machine en la submergeant de trafic inutile. Plusieurs machines à la fois"
                        + " sont à l'origine de cette attaque (c'est une attaque distribuée) qui vise à "
                        + "anéantir des serveurs, des sous-réseaux, etc.";
                this.anecdotes = "- Une attaque DDoS coûte entre 340 et 740€ tout compris avec zombies payants.\n"
                        + "- Le site du Ministère de la Culture tombe avec 246 'zombies'.\n"
                        + "- Dernièrement, les ayants droit ont payé une entreprise indienne afin qu'ils DDoS ThePirateBay, plus gros site de téléchargement au monde.";
                break;
            case "Phishing":
                this.effet = "Force l'adversaire à attaquer cette carte au prochain tour (jetable)";
                this.description = "Le phishing est est utilisé dans le but de perpétrer une usurpation d'identité. "
                        + "La technique consiste à faire croire à la victime qu'elle s'adresse à un tiers de "
                        + "confiance — banque, administration, etc. — afin de lui soutirer des renseignements "
                        + "personnels : mot de passe, numéro de carte de crédit, date de naissance, etc. C'est "
                        + "une forme d'attaque informatique reposant sur l'ingénierie sociale (faille humaine et non informatique).";
                this.anecdotes = "- Un faux mail du Ministère de l'Intérieur a été envoyé à plusieurs milliers de Français, les invitant "
                        + "à remplir un 'quizz sur le phishing', dans lequel ils devaient rentrer leurs informations personnelles "
                        + "'pour être recontactés'";
                break;
            case "Spam":
                this.effet = "Enlève un certain nombre de PV à la carte ou aux PV de l'adversaire";
                this.description = "Le spamming peut être défini comme l'usage abusif d'un système de messagerie électronique "
                        + "destiné à exposer délibérément et généralement de manière répétée tout ou partie de ses utilisateurs "
                        + "à des messages ou à des contenus non pertinents et non sollicités, souvent en faisant en sorte de "
                        + "les confondre avec les messages ou les contenus habituellement échangés ou recherchés par ces utilisateurs.";
                this.anecdotes = "- Selon Microsoft et Symantec (Norton), 90 à 95% des mails échangés sont des spams.\n"
                        + "- A l'origine, le mot spam, un acronyme de SPiced hAM, est une marque de pâté bas de gamme américain.";
                break;
            case "Spyware":
                this.effet = "Permet au joueur d'attaquer directement les PV de l'adversaire, ignorant sa défense (jetable)";
                this.description = "Un spyware est un programme conçu dans le but de collecter des données personnelles sur "
                        + "ses utilisateurs et de les envoyer à son concepteur ou à un tiers via internet ou tout autre réseau "
                        + "informatique, sans avoir obtenu au préalable une autorisation explicite et éclairée desdits utilisateurs. "
                        + "C'est grace au Spam que les DoS deviennent DDoS, par infection ni consentie ni conne";
                this.anecdotes = "- En 2006, il y avait en moyenne 30 spywares par ordinateur connecté à internet\n"
                        + "- A l'heure actuelle, aucun antivirus n'est capable de détecter plus de 90% des spywares, et d'en supprimer plus de 80%";
                break;
            case "Trojan":
                this.effet = "Lance une puissante attaque à retardement, avec effet au prochain tour (jetable)";
                this.description = "Un trojan, ou Cheval de Troie, est un programme utilisé comme véhicule pour introduire "
                        + "dans un dispositif un ou plusieurs autres programmes, généralement des parasites, cachés "
                        + "à l'intérieur du premier. Il a deux caractéristiques :\n"
                        + "- Un comportement apparent utile à l'utilisateur de l'ordinateur (c'est le porteur, le véhicule)\n"
                        + "- Un comportement caché, malveillant, conduisant à la destruction ou la divulgation des données ou à "
                        + "l'ouverture d'une porte dans le système de communication et à l'espionnage, la publicité etc";
                this.anecdotes = "- Un trojan nommé Jerusalem est connu pour s'activer tous les vendredi 13, en supprimant notamment"
                        + "tous les fichiers exécutables de l'ordinateur, et rendant bon nombre des autres inutilisables.";
                break;
            case "Worm":
                this.effet = "Neutralise une carte de défense adverse pendant 1 tour"; // ?
                this.description = "Un worm ou ver et un programme capable de se répliquer à travers les terminaux connectés à un réseau, "
                        + "puis d’exécuter certaines actions pouvant porter atteinte à l’intégrité des systèmes d’exploitation."
                        + "Il peut par exemple, à son ouverture dans un mail reçu, se propager à tous vos contacts mails";
                this.anecdotes = "- Un tel worm à propagation par mail, MyDoom, envoyait le message 'andy; I’m just doing my job, nothing personal, sorry.'"
                        + ", et s'est répandu si vite et si bien qu'il a ralentit le traffic mondial de 10%.\n"
                        + "- Un autre était capable de se répliquer plusieurs millions de fois en quelques heures sur chaque machine infectée,"
                        + "il a heureusement été programmé pour se désactiver automatiquement 6 mois plus tard, ne causant ainsi que 37 millions de $ de dégâts estimés";
                break;
            case "Firewall":
                this.effet = "Se positionne devant nos points de vie pour les protéger";
                this.description = "Un pare-feu (appelé aussi coupe-feu, garde-barrière ou firewall en anglais), est un système "
                        + "permettant de protéger un ordinateur ou un réseau d'ordinateurs des intrusions provenant d'un réseau "
                        + "tiers (notamment internet). Le pare-feu est un système permettant de filtrer les paquets de données "
                        + "échangés avec le réseau, il s'agit ainsi d'une passerelle filtrante";
                this.anecdotes = "- Les routeurs actuels, offrant un accès permanent à internet, sont presque tous dotés d'un firewall intégré.\n"
                        + "- Puisqu'aujourd'hui tout le monde est équipé d'un pare-feu, les attaques standards ont presque disparu.\n";
                break;
            case "Cloud":
                this.effet = "Garantit une immunité totale pendant 1 tour (jetable)";
                this.description = "Le cloud computing ou 'cloud' (nuage en anglais) désigne un ensemble de processus qui consiste à"
                        + " utiliser la puissance de calcul et/ou de stockage de serveurs informatiques distants à travers un réseau, "
                        + "généralement Internet.  Ces ordinateurs serveurs sont loués à la demande, le plus souvent par tranche "
                        + "d'utilisation selon des critères techniques (puissance, bande passante...) mais également au forfait. "
                        + "Il s'agit donc d'une dématérialisation de l'infrastructure informatique.";
                this.anecdotes = "- Le budget 2011 de Microsoft était à consacré à 90% au cloud computing.\n"
                        + "- En 2020, le marché du cloud représentera aux alentours de 241 milliards de dollars.";
                break;
            case "Update":
                this.effet = "Une mise à jour des protocoles de sécurité qui rajoute des PV au joueur (jetable)";
                this.description = "Une mise à jour, souvent abrégé en MAJ ou MàJ, est l'action qui consiste à mettre « à jour », "
                        + "ou bien « à niveau », un outil informatique, un service ou une prestation en téléchargeant, ou en chargeant,"
                        + " un nouveau logiciel, micrologiciel, inter-logiciel ou encore le contenu de quelconques données."
                        + " Une mise à jour sert à améliorer le rendement, l'efficacité ou la prestation d'un service ou d'un produit,"
                        + " et parfois de corriger les bugs d'un programme donné.";
                this.anecdotes = "- Avast (v7 et 8) effectue quotidiennement une vingtaine de mises à jour (système Cloud)"
                        + " cumulant 25000 nouvelles signatures de virus divers.\n"
                        + "- Fin mars, une faille de sécurité chez Apple exposait les utilisateurs à une attaque 'Man-In-The-Middle'."
                        + "Elle était assez ancienne, et due à un copier-collé raté. Une mise à jour a dans un premier temps été"
                        + "diffusée sans aucun détails, avant de faire l'objet d'une annonce officielle à la suite du tollé médiatique engendré.";
                break;
        }
    }

    /**
     * Retourne l'effet spécial de la carte.
     *
     * @return l'effet de la carte.
     */
    public String getEffet() {
        return this.effet;
    }

    /**
     * Permet de définir l'effet spécial de la carte.
     *
     * @param effet : Nouvel effet de la carte.
     */
    public void setEffet(String effet) {
        this.effet = effet;
    }

    /**
     * Retourne la description de la carte
     *
     * @return description de la carte
     */
    public String getDescription() {
        return this.description;
    }

    /**
     * Permet d'attribuer une description à la carte
     *
     * @param description
     */
    public void setDescription(String description) {
        this.description = description;
    }

    /**
     * Retourne les anectodes de la Carte
     *
     * @return Un String contenant les anecdotes de la carte.
     */
    public String getAnectodes() {
        return this.anecdotes;
    }

    /**
     * Permet de définir une nouvelle anedcote pour la carte
     *
     * @param anecdotes Nouvelle anecdote de la carte
     */
    public void setAnecdotes(String anecdotes) {
        this.anecdotes = anecdotes;
    }

    /**
     * Retourne le Type de la carte
     *
     * @return Le nom du type
     */
    public String getNomType() {
        return this.nomType;
    }

    /**
     * Permet de modifier le type attribué à la carte
     *
     * @param nomType Nouveau nom du type
     */
    public void setNomType(String nomType) {
        this.nomType = nomType;
    }

    /**
     * Permet d'activer l'effet spécial de la carte. Pas encore implémenté.
     */
    public void activerEffet() {
        // TODO - implement Type.activerEffet
        throw new UnsupportedOperationException();
    }
}
